﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using RRTWSEntityDSD.Bean;
using RRTWSEntityDSD.Dominio;
using RRTWSDSD.ServiceEntidad;

namespace RRTWSDSD.ServiceNegocio
{
    /// <summary>
    /// Summary description for ReservarAsientosServices
    /// </summary>
    [WebService(Namespace = "http://rtt.edu.upc.com.pe/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class ReservarAsientosServices : System.Web.Services.WebService
    {
        private static ClienteServices clienteService = new ClienteServices();
        private static EventoServices eventoService = new EventoServices();
        private static AsientoService asientoService = new AsientoService();
        private static OperacionEnLineaServices operacionEnLineaService = new OperacionEnLineaServices();
        private static EntradaService entradaService = new EntradaService();
        private static PagoServices pagoService = new PagoServices();
        private static RRTWSEntityDSD.CalcularServiceServiceReference.CalcularServiceSoapClient proxy = new RRTWSEntityDSD.CalcularServiceServiceReference.CalcularServiceSoapClient();
        private static RRTWSEntityDSD.GenerarTicketServiceServiceReference.GenerarTicketServiceSoapClient proxygenerar = new RRTWSEntityDSD.GenerarTicketServiceServiceReference.GenerarTicketServiceSoapClient();

        [WebMethod]
        public ReservaAsiento reservarAsiento(string uuid, int evento, int[] asientos, string entidadBancaria)
        {
            if (asientos == null && asientos.Length == 0)
            {
                throw new NullReferenceException("Lista de asientos es nula o esta vacia");
            }
            if (evento == 0)
            {
                throw new NullReferenceException("Evento Deportivo invalido");
            }
           
            //273 7777

            try
            {
                Cliente clienteUuID = clienteService.getCliente(uuid);
                DateTime fechaActual = DateTime.Now;
                EventoDeportivo eventoDeportivo = eventoService.getEvento(evento);
                DateTime fechainico = DateTime.Parse(eventoDeportivo.fechaInicio);
                string fin = fechaActual.ToString();
                double diferencia = proxy.calcularDiferenciaFechasHoras(fin, fechainico.ToString());

                if (diferencia <= 48) // si es menor a uno(un dia o 24 horas) 
                {
                    throw new NullReferenceException("Limite de fecha excedido para comprar Online");
                }

                List<Asiento> listaAsientos = new List<Asiento>();
                Asiento asiento = null;
                foreach (int idasiento in asientos)
                {
                    asiento = asientoService.getAsientoDisponiblePorEvento(idasiento, evento);
                    listaAsientos.Add(asiento);
                }
                double montoTotal = proxy.montoTotal(eventoDeportivo.precioEntrada, listaAsientos.Count);

                /*
                 falta validar el numero de tarjeta con algun servicio(simulado) del banco 
                 * si es exitoso se procede al pago en caso contrario lanza una exception(idea puede ser por REST)
                 */

                OperacionLinea operacionEnLinea = new OperacionLinea();
                operacionEnLinea.idCliente = clienteUuID.idcliente;
                operacionEnLinea.montoTotal = montoTotal;
                operacionEnLinea.ticket = proxygenerar.generarTicket(clienteUuID.idcliente);
                operacionEnLinea.fechaOperacion = String.Format("{0:u}", DateTime.Now);
                operacionEnLinea = operacionEnLineaService.creaNuevaOperacion(operacionEnLinea);

                Pago pago = pagoService.registrarPago(operacionEnLinea.idOperacion, 2, entidadBancaria, null);

                foreach (Asiento asient in listaAsientos)
                {
                    entradaService.crearEntrada(asient.idAsiento, evento, eventoDeportivo.precioEntrada, operacionEnLinea.idOperacion, 2);
                }

                ReservaAsiento reservaAsiento = new ReservaAsiento();
                reservaAsiento.operacionEnLinea = operacionEnLinea;
                reservaAsiento.pago = pago;

                return reservaAsiento;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        [WebMethod]
        public ReservaAsiento getOperacionLineaPorTicket(string ticket)
        {
            if (ticket == null && ticket.Length == 0)
            {
                throw new NullReferenceException("Ticket no valido");
            }
            OperacionLinea operacionEnLinea = operacionEnLineaService.getOperacionModoEfectivo(ticket);
            if (operacionEnLinea == null)
            {
                throw new NullReferenceException("Operacion no es valida");
            }
            Pago pago = pagoService.getPagoPorOperacionEnLinea(operacionEnLinea.idOperacion);
            if (pago == null)
            {
                throw new NullReferenceException("Pago no esta referenciado a la operacion en linea");
            }
            ReservaAsiento reservaAsiento = new ReservaAsiento();
            reservaAsiento.operacionEnLinea = operacionEnLinea;
            reservaAsiento.pago = pago;
            
            return reservaAsiento;
        }

        [WebMethod]
        public Pago registrarPagoReserva(int operacion)
        {
           Pago p =  pagoService.actualizarPagoEnEfectivo(operacion);
            return p;
        }
    }
}
